﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using ElevenGlobal;

namespace ElevenData
{
    public class Insertar
    {

        #region Configuración

        public static bool insertarDatosEmpresaNueva()
        {
            try
            {
                SqlConnection conn = new SqlConnection(Configuracion.connectionString);
                SqlCommand comando = new SqlCommand("INSERT INTO [11EMPRESA] VALUES(1, '000000000', 'Mi Empresa', 'Mi Empresa S.A.', '', '', '', '', 'sac@miempresa.com', 'http://www.miempresa.com')");
                comando.Connection = conn;
                conn.Open();
                comando.ExecuteNonQuery();
                conn.Close();
                return true;
            }
            catch (Exception e){
                Cache.ErrorActual = e.Message;
                return false;
            }
            
        }

        #endregion

        #region Gerencia

        public static bool insertarPais(string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PAISES] VALUES(@Nombre)");
            SqlParameter param;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarProvincias(int IdPais, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PROVINCIAS] VALUES(@IdPais, @Nombre)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdPais", SqlDbType.Int);
            param.Value = IdPais;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarCantones(int IdProvincia, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11CANTONES] VALUES(@IdProvincia, @Nombre)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdProvincia", SqlDbType.Int);
            param.Value = IdProvincia;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarDistritos(int IdCanton, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11DISTRITOS] VALUES(@IdCanton, @Nombre)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdCanton", SqlDbType.Int);
            param.Value = IdCanton;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        #endregion

        #region Inventario

        public static bool insertarProveedor(string CedJuridica, string Nombre, string NombreJuridico,
            string Direccion, int IdDistrito, string Telefono, string Telefono2, string Fax, string Correo, string SitioWeb)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PROVEEDORES] VALUES(@CedJuridica, @Nombre, @NombreJuridico, "
                + "@Direccion, @IdDistrito, @Telefono, @Telefono2, @Fax, @Correo, @SitioWeb)");
            SqlParameter param;
            param = comando.Parameters.Add("@CedJuridica", SqlDbType.VarChar, 15);
            param.Value = CedJuridica;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@NombreJuridico", SqlDbType.VarChar, 50);
            param.Value = NombreJuridico;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            param = comando.Parameters.Add("@IdDistrito", SqlDbType.Int);
            param.Value = IdDistrito;
            param = comando.Parameters.Add("@Telefono", SqlDbType.VarChar, 20);
            param.Value = Telefono;
            param = comando.Parameters.Add("@Telefono2", SqlDbType.VarChar, 20);
            param.Value = Telefono2;
            param = comando.Parameters.Add("@Fax", SqlDbType.VarChar, 20);
            param.Value = Fax;
            param = comando.Parameters.Add("@Correo", SqlDbType.VarChar, 100);
            param.Value = Correo;
            param = comando.Parameters.Add("@SitioWeb", SqlDbType.VarChar, 100);
            param.Value = SitioWeb;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarCategoria(string Nombre, string Descripcion)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PRODCAT] VALUES(@Nombre, @Descripcion)");
            SqlParameter param;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarSubcategoria(int IdCategoria, string Nombre, string Descripcion)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PRODSUBCAT] VALUES(@IdCategoria, @Nombre, @Descripcion)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdCategoria", SqlDbType.Int);
            param.Value = IdCategoria;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarProductos(int IdSubcategoria, string Nombre, string Descripcion, int Cantidad, string IdCodigoBarras, int Gravado)
        {

            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PRODUCTOS] VALUES(@IdSubcategoria, @Nombre, @Descripcion, @Cantidad, @IdCodigoBarras, @Gravado)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdSubcategoria", SqlDbType.Int);
            param.Value = IdSubcategoria;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 100);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            param = comando.Parameters.Add("@Cantidad", SqlDbType.Int);
            param.Value = Cantidad;
            param = comando.Parameters.Add("@IdCodigoBarras", SqlDbType.VarChar, 50);
            param.Value = IdCodigoBarras;
            param = comando.Parameters.Add("@Gravado", SqlDbType.Int);
            param.Value = Gravado;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarOrdenCompra(int IdProveedor, string Cliente, string Direccion, DateTime Fecha, int TipoCompra, int IVI, int Entregado, double Descuento, DataTable Detalles)
        {
            SqlTransaction tran;
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11ORDENCOMPRA] VALUES(@IdProveedor, @Cliente, @Direccion, @Fecha, @TipoCompra, @IVI, @Entregado, @Descuento, @Guid, @Impuesto)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdProveedor", SqlDbType.Int);
            param.Value = IdProveedor;
            param = comando.Parameters.Add("@Cliente", SqlDbType.VarChar, 100);
            param.Value = Cliente;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
            param.Value = Fecha;
            param = comando.Parameters.Add("@TipoCompra", SqlDbType.Int);
            param.Value = TipoCompra;
            param = comando.Parameters.Add("@IVI", SqlDbType.Int);
            param.Value = IVI;
            param = comando.Parameters.Add("@Entregado", SqlDbType.Int);
            param.Value = Entregado;
            param = comando.Parameters.Add("@Descuento", SqlDbType.Real);
            param.Value = Descuento;
            string Guid = System.Guid.NewGuid().ToString();
            param = comando.Parameters.Add("@Guid", SqlDbType.VarChar, 50);
            param.Value = Guid;
            param = comando.Parameters.Add("@Impuesto", SqlDbType.Int);
            param.Value = Configuracion.impuestoVenta;
            comando.Connection = conn;
            conn.Open();
            tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted);
            try
            {
                comando.Transaction = tran;
                comando.ExecuteNonQuery();

                //Obtener ID OrdenCompra recién creada.
                DataTable dt = Consultar.ConsultarOrdenCompraRecienInsertada(conn, tran, Guid);
                DataRow dr = dt.Rows[0];
                int IdOrdenCompra = int.Parse(dr[0].ToString());

                insertarDTOrdenCompra(Detalles, conn, tran, Entregado, IdOrdenCompra);

                tran.Commit();
                conn.Close();
                return true;
            }
            catch (Exception ex) {
                Cache.ErrorActual = ex.Message;
                tran.Rollback();
                conn.Close();
                return false;
            }
        }

        public static bool insertarDTOrdenCompra(DataTable Detalles, SqlConnection conn, SqlTransaction tran, int Entregado, int IdOrdenCompra)
        {
            foreach(DataRow dr in Detalles.Rows)
            {
                SqlCommand comando = new SqlCommand("INSERT INTO [11DTORDENCOMPRA] VALUES(@IdOrdenCompra, @IdProducto, @Cantidad, @PrecioUnitario)");
                SqlParameter param;
                param = comando.Parameters.Add("@IdOrdenCompra", SqlDbType.Int);
                param.Value = IdOrdenCompra;
                param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
                param.Value = int.Parse(dr[0].ToString());
                param = comando.Parameters.Add("@Cantidad", SqlDbType.Int);
                param.Value = int.Parse(dr[1].ToString());
                param = comando.Parameters.Add("@PrecioUnitario", SqlDbType.Real);
                param.Value = double.Parse(dr[2].ToString());
                comando.Connection = conn;
                comando.Transaction = tran;
                comando.ExecuteNonQuery();
                if (Entregado == 1)
                {
                    //Modificar Cantidad
                    //11DTORDENCOMPRA.IdProducto
                    DataTable dt = Consultar.ConsultarProductoXID(int.Parse(dr[0].ToString()), conn, tran);
                    //1ra Fila
                    DataRow dr2 = dt.Rows[0];
                    //11PRODUCTOS.Cantidad + 11DTORDENCOMPRA.Cantidad
                    int Cantidad = int.Parse(dr2[4].ToString()) + int.Parse(dr[1].ToString());
                    //11DTORDENCOMPRA.IdProducto
                    Modificar.modificarProductoCantidad(int.Parse(dr[0].ToString()), Cantidad, conn, tran);
                }
            }
            
            return true;
        }

        public static bool insertarPrecioVenta(int IdProducto, double PrecioVenta)
        {
            try
            {
                SqlConnection conn = new SqlConnection(Configuracion.connectionString);
                SqlCommand comando = new SqlCommand("INSERT INTO [11PRECIOVENTAPROD] VALUES(@IdProducto, @PrecioVenta, @Fecha)");
                SqlParameter param;
                param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
                param.Value = IdProducto;
                param = comando.Parameters.Add("@PrecioVenta", SqlDbType.Real);
                param.Value = PrecioVenta;
                param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
                param.Value = DateTime.Now;
                comando.Connection = conn;
                conn.Open();
                comando.ExecuteNonQuery();
                conn.Close();
                return true;
            }
            catch (Exception ex)
            {
                Cache.ErrorActual = ex.Message;
                return false;
            }
        }

        public static bool insertarPerdida(int IdProducto, int Cantidad, DateTime Fecha, string Motivo)
        {
            SqlTransaction tran;
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11PERDIDAS] VALUES(@IdProducto, @Cantidad, @Fecha, @Motivo)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
            param.Value = IdProducto;
            param = comando.Parameters.Add("@Cantidad", SqlDbType.Int);
            param.Value = Cantidad;
            param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
            param.Value = Fecha;
            param = comando.Parameters.Add("@Motivo", SqlDbType.VarChar, 100);
            param.Value = Motivo;
            comando.Connection = conn;
            conn.Open();
            tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted);
            try
            {
                comando.Transaction = tran;
                comando.ExecuteNonQuery();
                //Modificar Cantidad
                DataTable dt = Consultar.ConsultarProductoXID(IdProducto, conn, tran);
                DataRow dr2 = dt.Rows[0];
                int CantidadNueva = int.Parse(dr2["Cantidad"].ToString()) - Cantidad;
                Modificar.modificarProductoCantidad(IdProducto, CantidadNueva, conn, tran);

                tran.Commit();
                conn.Close();
                return true;
            }
            catch (Exception)
            {
                tran.Rollback();
                conn.Close();
                return false;
            }
        }

        #endregion

        #region Punto de Venta

        public static bool insertarCliente(string Cedula, string Apellido1, string Apellido2, string Nombre,
            string Direccion, int IdDistrito, string Telefono, string Telefono2, string Celular, string Correo)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11CLIENTES] VALUES(@Cedula, @Apellido1, @Apellido2, @Nombre"
                + ", @Direccion, @IdDistrito, @Telefono, @Telefono2, @Celular, @Correo)");
            SqlParameter param;
            param = comando.Parameters.Add("@Cedula", SqlDbType.VarChar, 15);
            param.Value = Cedula;
            param = comando.Parameters.Add("@Apellido1", SqlDbType.VarChar, 50);
            param.Value = Apellido1;
            param = comando.Parameters.Add("@Apellido2", SqlDbType.VarChar, 50);
            param.Value = Apellido2;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            param = comando.Parameters.Add("@IdDistrito", SqlDbType.Int);
            param.Value = IdDistrito;
            param = comando.Parameters.Add("@Telefono", SqlDbType.VarChar, 20);
            param.Value = Telefono;
            param = comando.Parameters.Add("@Telefono2", SqlDbType.VarChar, 20);
            param.Value = Telefono2;
            param = comando.Parameters.Add("@Celular", SqlDbType.VarChar, 20);
            param.Value = Celular;
            param = comando.Parameters.Add("@Correo", SqlDbType.VarChar, 100);
            param.Value = Correo;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool insertarFactura(int IdCliente, string Cedula, string NombreCliente, string Direccion
            , DateTime Fecha, int TipoCompra, int IVI, int Entregado, double Descuento, int Anulada, string NombreEmpr
            , string NombreJurEmpr, string CedJuridica, DataTable Detalles)
        {
            SqlTransaction tran;
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("INSERT INTO [11FACTURA] VALUES(@IdCliente, @Cedula, @NombreCliente" + 
                ", @Direccion, @Fecha, @TipoCompra, @IVI, @Entregado, @Descuento, @Anulada, @NombreEmpr, @NombreJurEmpr" + 
                ", @CedJuridica, @Guid, @Puntos, @Impuesto)");
            SqlParameter param;
            param = comando.Parameters.Add("@IdCliente", SqlDbType.Int);
            param.Value = IdCliente;
            param = comando.Parameters.Add("@Cedula", SqlDbType.VarChar, 100);
            param.Value = Cedula;
            param = comando.Parameters.Add("@NombreCliente", SqlDbType.VarChar, 200);
            param.Value = NombreCliente;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
            param.Value = Fecha;
            param = comando.Parameters.Add("@TipoCompra", SqlDbType.Int);
            param.Value = TipoCompra;
            param = comando.Parameters.Add("@IVI", SqlDbType.Int);
            param.Value = IVI;
            param = comando.Parameters.Add("@Entregado", SqlDbType.Int);
            param.Value = Entregado;
            param = comando.Parameters.Add("@Descuento", SqlDbType.Real);
            param.Value = Descuento;
            param = comando.Parameters.Add("@Anulada", SqlDbType.Int);
            param.Value = Anulada;
            param = comando.Parameters.Add("@NombreEmpr", SqlDbType.VarChar, 50);
            param.Value = NombreEmpr;
            param = comando.Parameters.Add("@NombreJurEmpr", SqlDbType.VarChar, 50);
            param.Value = NombreJurEmpr;
            param = comando.Parameters.Add("@CedJuridica", SqlDbType.VarChar, 15);
            param.Value = CedJuridica;
            param = comando.Parameters.Add("@Impuesto", SqlDbType.Int);
            param.Value = Configuracion.impuestoVenta;
            string Guid = System.Guid.NewGuid().ToString();
            param = comando.Parameters.Add("@Guid", SqlDbType.VarChar, 50);
            param.Value = Guid;
            //CAMBIAR LUEGO
            param = comando.Parameters.Add("@Puntos", SqlDbType.Int);
            param.Value = 0;
            comando.Connection = conn;
            conn.Open();
            tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted);
            try
            {
                comando.Transaction = tran;
                comando.ExecuteNonQuery();

                //Obtener ID Factura recién creada.
                DataTable dt = Consultar.ConsultarFacturaRecienInsertada(conn, tran, Guid);
                DataRow dr = dt.Rows[0];
                int IdFactura = int.Parse(dr["IdFactura"].ToString());

                insertarDTFactura(Detalles, conn, tran, Entregado, IdFactura);

                tran.Commit();
                conn.Close();
                return true;
            }
            catch (Exception ex)
            {
                Cache.ErrorActual = ex.Message;
                tran.Rollback();
                conn.Close();
                return false;
            }
        }

        public static bool insertarDTFactura(DataTable Detalles, SqlConnection conn, SqlTransaction tran, int Entregado, int IdFactura)
        {
            foreach (DataRow dr in Detalles.Rows)
            {
                SqlCommand comando = new SqlCommand("INSERT INTO [11DTFACTURA] VALUES(@IdFactura, @IdProducto, @Cantidad, @PrecioUnitario)");
                SqlParameter param;
                param = comando.Parameters.Add("@IdFactura", SqlDbType.Int);
                param.Value = IdFactura;
                param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
                param.Value = int.Parse(dr["IdProducto"].ToString());
                param = comando.Parameters.Add("@Cantidad", SqlDbType.Int);
                param.Value = int.Parse(dr["Cantidad"].ToString());
                param = comando.Parameters.Add("@PrecioUnitario", SqlDbType.Real);
                param.Value = double.Parse(dr["PrecioUnitario"].ToString());
                comando.Connection = conn;
                comando.Transaction = tran;
                comando.ExecuteNonQuery();
                if (Entregado == 1)
                {
                    //Modificar Cantidad
                    //11DTORDENCOMPRA.IdProducto
                    DataTable dt = Consultar.ConsultarProductoXID(int.Parse(dr["IdProducto"].ToString()), conn, tran);
                    //1ra Fila
                    DataRow dr2 = dt.Rows[0];
                    //11PRODUCTOS.Cantidad - 11DTORDENCOMPRA.Cantidad
                    int Cantidad = int.Parse(dr2["Cantidad"].ToString()) - int.Parse(dr["Cantidad"].ToString());
                    //11DTORDENCOMPRA.IdProducto
                    Modificar.modificarProductoCantidad(int.Parse(dr["IdProducto"].ToString()), Cantidad, conn, tran);
                }
            }

            return true;
        }

        #endregion

        #region Clientes

        public static bool insertarConsultas(int IdCliente, int NivelSatisfaccion, string Contenido, DateTime Fecha)
        {
            try
            {
                SqlConnection conn = new SqlConnection(Configuracion.connectionString);
                SqlCommand comando = new SqlCommand("INSERT INTO [11CONSULTAS] VALUES(@IdCliente, @NivelSatisfaccion, @Contenido, @Fecha)");
                SqlParameter param;
                param = comando.Parameters.Add("@IdCliente", SqlDbType.Int);
                param.Value = IdCliente;
                param = comando.Parameters.Add("@NivelSatisfaccion", SqlDbType.Int);
                param.Value = NivelSatisfaccion;
                param = comando.Parameters.Add("@Contenido", SqlDbType.VarChar, 250);
                param.Value = Contenido;
                param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
                param.Value = Fecha;
                comando.Connection = conn;
                conn.Open();
                comando.ExecuteNonQuery();
                conn.Close();
                return true;
            }
            catch (Exception ex)
            {
                Cache.ErrorActual = ex.Message;
                return false;
            }
        }

        #endregion

    }
}
